package com.nowcoder.topic.dp.middle;

/**
 * NC183 最长公共子数组
 * @author d3y1
 */
public class NC183{
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param A int整型一维数组
     * @param B int整型一维数组
     * @return int整型
     */
    public int longestCommonSubarry (int[] A, int[] B) {
        return solution(A, B);
    }

    /**
     * 动态规划
     *
     * dp[i][j]表示A中以第i个整数为结尾(A[i-1]必选)且B中以第j个整数为结尾(B[j-1]必选)时的公共子数组的长度
     *
     *            { dp[i-1][j-1] + 1  , A[i-1] == B[j-1]
     * dp[i][j] = {
     *            { 0                 , A[i-1] != B[j-1]
     *
     * @param A
     * @param B
     * @return
     */
    private int solution(int[] A, int[] B){
        int lenA = A.length;
        int lenB = B.length;

        int[][] dp = new int[lenA+1][lenB+1];
        int result = 0;
        for(int i=1; i<=lenA; i++){
            for(int j=1; j<=lenB; j++){
                if(A[i-1] == B[j-1]){
                    dp[i][j] = dp[i-1][j-1] + 1;
                    result = Math.max(result, dp[i][j]);
                }else{
                    dp[i][j] = 0;
                }

            }
        }

        return result;
    }
}